package jsyf.com.util;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by 92852 on 2018/8/16.
 */
public class ExportCustomerExcel {

    private final Logger logger = LoggerFactory.getLogger(ExportExcel.class);
    //显示的导出表的标题
    private String title;
    //导出表的列名
    private String[] rowName;

    private List<Object[]> dataList = new ArrayList<Object[]>();

    private HttpServletResponse response;

    //构造方法，传入要导出的数据
    public ExportCustomerExcel(String title, String[] rowName, List<Object[]> dataList, HttpServletResponse  response) {
        this.dataList = dataList;
        this.rowName = rowName;
        this.title = title;
        this.response = response;
    }

    /*
    * 导出数据
    * xsl--new HSSFWorkbook();
    * xslx--new XSSFWorkbook();
    * */
    public void export() throws Exception {
        try {
            XSSFWorkbook workbook =new XSSFWorkbook(); // 创建一个excel对象
            XSSFSheet sheet =workbook.createSheet(title); // 创建表格
            // 产生表格标题行
            sheet.setDefaultRowHeightInPoints(20);
            XSSFRow rowm  =sheet.createRow(0);  // 行
            XSSFCell cellTiltle =rowm.createCell(0);  // 单元格

            // sheet样式定义
            XSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook); // 头样式
            XSSFCellStyle style = this.getStyle(workbook);  // 单元格样式
            /**
             * 参数说明
             * 从0开始   第一行 第一列 都是从角标0开始
             * 行 列 行列    (0,0,0,5)  合并第一行 第一列  到第一行 第六列
             * 起始行，起始列，结束行，结束列
             *
             * new Region()  这个方法使过时的
             */
            // 合并第一行的所有列
            sheet.addMergedRegion(new CellRangeAddress(0, (short) 0, 0, (short) (rowName.length-1)));
            cellTiltle.setCellStyle(columnTopStyle);
            cellTiltle.setCellValue(title);

            int columnNum = rowName.length;  // 表格列的长度
            XSSFRow rowRowName = sheet.createRow(1);  // 在第二行创建行
            XSSFCellStyle cells =workbook.createCellStyle();
            cells.setBottomBorderColor(HSSFColor.BLACK.index);
            rowRowName.setRowStyle(cells);

            // 循环 将列名放进去
            for (int n = 0; n < columnNum; n++) {
                XSSFCell cellRowName = rowRowName.createCell(n);                //创建列头对应个数的单元格
                cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);                //设置列头单元格的数据类型
                XSSFRichTextString text = new XSSFRichTextString(rowName[n]);
                cellRowName.setCellValue(text);                                    //设置列头单元格的值
                cellRowName.setCellStyle(columnTopStyle);
            }

            // 将查询到的数据设置到对应的单元格中
            for (int i = 0; i < dataList.size(); i++) {

                Object[] obj = dataList.get(i);//遍历每个对象
                XSSFRow row = sheet.createRow(i + 2);//创建所需的行数

                for (int j = 0; j < obj.length; j++) {
                    XSSFCell cell = null;   //设置单元格的数据类型
                    cell = row.createCell(j, XSSFCell.CELL_TYPE_STRING);
                    cell.setCellValue(obj[j] != null ? obj[j].toString() : "");
                    cell.setCellStyle(style);                                    //设置单元格样式
                }
            }
            //  让列宽随着导出的列长自动适应
            for (int i=0;i<12;i++){
                sheet.autoSizeColumn((short)i);
                int colWidth = sheet.getColumnWidth(i)*17/10;
                if(colWidth<255*256){
                    sheet.setColumnWidth(i, colWidth < 3000 ? 3000 : colWidth);
                }else{
                    sheet.setColumnWidth(i,6000 );
                }
            }
            // 第七步，将文件输出到客户端浏览器
            if(workbook !=null){
                try
                {
                    // excel 表文件名
                    String fileName = title + String.valueOf(System.currentTimeMillis()).substring(4, 13) +".xlsx";
                    String fileName11 = URLEncoder.encode(fileName,"UTF-8");
                    String headStr = "attachment; filename=\"" + fileName11 + "\"";
                    response.setContentType("APPLICATION/OCTET-STREAM");
                    response.setHeader("Content-Disposition", headStr);
                    OutputStream out = response.getOutputStream();
                    workbook.write(out);
                    out.flush();
                    out.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }

            }
        }catch(Exception e){
            e.printStackTrace();
            throw new Exception("导出信息失败！");
        }
    }


    /*
    * 销售台账导出
    * */
    public void exportContractAccount(int cloumLength) throws Exception {
        try {
            XSSFWorkbook workbook =new XSSFWorkbook(); // 创建一个excel对象
            XSSFSheet sheet =workbook.createSheet(title); // 创建表格
            // 产生表格标题行
            sheet.setDefaultRowHeightInPoints(20);
            XSSFRow rowm  =sheet.createRow(0);  // 行
            XSSFCell cellTiltle =rowm.createCell(0);  // 单元格

            // sheet样式定义
            XSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook); // 头样式
            XSSFCellStyle style = this.getStyle(workbook);  // 单元格样式
            /**
             * 参数说明
             * 从0开始   第一行 第一列 都是从角标0开始
             * 行 列 行列    (0,0,0,5)  合并第一行 第一列  到第一行 第六列
             * 起始行，起始列，结束行，结束列
             *
             * new Region()  这个方法使过时的
             */
            // 合并第一行的所有列
            sheet.addMergedRegion(new CellRangeAddress(0, (short) 0, 0, (short) (rowName.length-1)));
            cellTiltle.setCellStyle(columnTopStyle);
            cellTiltle.setCellValue(title);

            int columnNum = rowName.length;  // 表格列的长度
            XSSFRow rowRowName = sheet.createRow(1);  // 在第二行创建行
            XSSFCellStyle cells =workbook.createCellStyle();
            cells.setBottomBorderColor(HSSFColor.BLACK.index);
            rowRowName.setRowStyle(cells);

            // 循环 将列名放进去
            for (int n = 0; n < columnNum; n++) {
                XSSFCell cellRowName = rowRowName.createCell(n);                //创建列头对应个数的单元格
                cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);                //设置列头单元格的数据类型
                XSSFRichTextString text = new XSSFRichTextString(rowName[n]);
                cellRowName.setCellValue(text);                                    //设置列头单元格的值
                cellRowName.setCellStyle(columnTopStyle);
            }

            // 将查询到的数据设置到对应的单元格中
            for (int i = 0; i < dataList.size(); i++) {

                Object[] obj = dataList.get(i);//遍历每个对象
                XSSFRow row = sheet.createRow(i + 2);//创建所需的行数

                for (int j = 0; j < obj.length; j++) {
                    XSSFCell cell = null;   //设置单元格的数据类型
                    cell = row.createCell(j, XSSFCell.CELL_TYPE_STRING);
                    cell.setCellValue(obj[j] != null ? obj[j].toString() : "");
                    cell.setCellStyle(style);                                    //设置单元格样式
                }
            }
            //  让列宽随着导出的列长自动适应
            for (int i=0;i<cloumLength;i++){
                sheet.autoSizeColumn((short)i);
                sheet.setColumnWidth(i,sheet.getColumnWidth(i)*17/10);
            }
          //  sheet.setColumnWidth(0, 3500);// 设置第一的宽度为
          //  sheet.setColumnWidth(1, 5000);// 设置第一的宽度为
            //  sheet.autoSizeColumn((short)9);

            // 第七步，将文件输出到客户端浏览器
            if(workbook !=null){
                try
                {
                    // excel 表文件名
                    String fileName = title + String.valueOf(System.currentTimeMillis()).substring(4, 13) +".xlsx";
                    String fileName11 = URLEncoder.encode(fileName,"UTF-8");
                    String headStr = "attachment; filename=\"" + fileName11 + "\"";
                    response.setContentType("APPLICATION/OCTET-STREAM");
                    response.setHeader("Content-Disposition", headStr);
                    OutputStream out = response.getOutputStream();
                    workbook.write(out);
                    out.flush();
                    out.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }

            }
        }catch(Exception e){
            e.printStackTrace();
            throw new Exception("导出信息失败！");
        }
    }



    /*
     * 列头单元格样式
     */
    public XSSFCellStyle getColumnTopStyle(XSSFWorkbook workbook) {

        // 设置字体
        XSSFFont font = workbook.createFont();
        //设置字体大小
        font.setFontHeightInPoints((short) 11);
        //字体加粗
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        //设置字体名字
        font.setFontName("Courier New");
        //设置样式;
        XSSFCellStyle style = workbook.createCellStyle();
        //设置底边框;
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        //设置底边框颜色;
        style.setBottomBorderColor(HSSFColor.BLACK.index);
        //设置左边框;
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        //设置左边框颜色;
        style.setLeftBorderColor(HSSFColor.BLACK.index);
        //设置右边框;
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        //设置右边框颜色;
        style.setRightBorderColor(HSSFColor.BLACK.index);
        //设置顶边框;
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        //设置顶边框颜色;
        style.setTopBorderColor(HSSFColor.BLACK.index);
        //在样式用应用设置的字体;
        style.setFont(font);
        //设置自动换行;
        style.setWrapText(false);
        //设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        //设置单元格背景颜色
        style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);

        return style;

    }

    /*
   * 列数据信息单元格样式
   */
    public XSSFCellStyle getStyle(XSSFWorkbook workbook) {
        // 设置字体
        XSSFFont font = workbook.createFont();
        //设置字体大小
        font.setFontHeightInPoints((short) 11);
        //设置字体名字
        font.setFontName("Courier New");
        //设置样式;
        XSSFCellStyle style = workbook.createCellStyle();
        //设置底边框;
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        //设置底边框颜色;
        style.setBottomBorderColor(HSSFColor.BLACK.index);
        //设置左边框;
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        //设置左边框颜色;
        style.setLeftBorderColor(HSSFColor.BLACK.index);
        //设置右边框;
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        //设置右边框颜色;
        style.setRightBorderColor(HSSFColor.BLACK.index);
        //设置顶边框;
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        //设置顶边框颜色;
        style.setTopBorderColor(HSSFColor.BLACK.index);
        //在样式用应用设置的字体;
        style.setFont(font);
        //设置自动换行;
        style.setWrapText(false);
        //设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

        return style;

    }

}
